/**
 * Project   : android-utility
 * Package   : org.basagee.activities
 * File name : DynamicListActivities.java
 * Author    : Basagee
 * Date      : 2011. 4. 15.

 * Copyright
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.basagee.activities;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import org.basagee.adapters.DynamicListAdapter;

/**
 * @author Basagee
 *
 */
public class DynamicListViewActivity extends Activity implements OnScrollListener {
	private static final String LOG = "DynamicListViewActivity";
	private DynamicListAdapter mAdapter;
	private ListView mListView;
	private LayoutInflater mInflater;
	private ArrayList<String> mRowList;
	private boolean mLockListView;

	/* (non-Javadoc)
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
        setContentView(R.layout.dynamic_list_view);
        
        // 멤버 변수 초기화
        mRowList = new ArrayList<String>();
        mLockListView = true;
        
        // 어댑터와 리스트뷰 초기화
        mAdapter = new DynamicListAdapter(this, R.layout.dynamic_list_item, mRowList);
        mListView = (ListView) findViewById(R.id.listView);
        
        // 푸터를 등록합니다. setAdapter 이전에 해야 합니다. 
        mInflater = (LayoutInflater) getSystemService(this.LAYOUT_INFLATER_SERVICE);
        mListView.addFooterView(mInflater.inflate(R.layout.dynamic_list_footer, null));
        
        // 스크롤 리스너를 등록합니다. onScroll에 추가구현을 해줍니다.
        mListView.setOnScrollListener(this);
        mListView.setAdapter(mAdapter);
        
        // 데미데이터를 추가하기 위해 임의로 만든 메서드 호출
        addItems(50);
	}

	/* (non-Javadoc)
	 * @see android.widget.AbsListView.OnScrollListener#onScroll(android.widget.AbsListView, int, int, int)
	 */
	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub

		// 현재 가장 처음에 보이는 셀번호와 보여지는 셀번호를 더한값이 전체의 숫자와 동일해지면 가장 아래로 스크롤 되었다고
		// 가정합니다.
		int count = totalItemCount - visibleItemCount;

		if (firstVisibleItem >= count && totalItemCount != 0 && mLockListView == false) {
			Log.i(LOG, "Loading next items");
			addItems(50);
		}	
	}

	/* (non-Javadoc)
	 * @see android.widget.AbsListView.OnScrollListener#onScrollStateChanged(android.widget.AbsListView, int)
	 */
	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// TODO Auto-generated method stub

	}

	/**
	 * 임의의 방법으로 더미 아이템을 추가합니다.
	 * 
	 * @param size
	 */
	private void addItems(final int size) {
		// 아이템을 추가하는 동안 중복 요청을 방지하기 위해 락을 걸어둡니다.
		mLockListView = true;
		
		Runnable run = new Runnable() {
			@Override
			public void run() {
				for(int i = 0 ; i < size ; i++) {
					mRowList.add("Item " + i);
				}
				
				// 모든 데이터를 로드하여 적용하였다면 어댑터에 알리고 리스트뷰의 락을 해제합니다.
				mAdapter.notifyDataSetChanged();
				mLockListView = false;
			}
		};
		
		// 속도의 딜레이를 구현하기 위한 꼼수
		Handler handler = new Handler();
		handler.postDelayed(run, 5000);
	}
}
